import { createRouter, createWebHistory } from "vue-router";
import store from "@/store";
import routesStatic from "./routes-static";

// 动态导入多个模块
const modules = import.meta.glob(["../views/**/*.vue", "!../views/**/components/*.vue"]);

const router = createRouter({
  history: createWebHistory(),
  routes: routesStatic,
});

// 白名单路由 name 集合。在这里配置的是不需要登录的
const whiteNames = ["login", "403", "404"];

router.beforeEach(async (to, from) => {
  // 非白名单的路由
  if (!whiteNames.includes(to.name)) {
    // 要做登录状态的校验
    // 1. 获取 token
    const token = store.state.user.token;
    // 2. 判断 token 是否存在
    if (!token) {
      // 去登录
      return {
        name: "login",
        query: {
          redirect: to.fullPath,
        },
      };
    }

    // // 判断路由权限
    // const routes = store.state.user.routes;
    // if (to.name !== "index" && !routes.includes(to.path)) {
    //   // 没有访问权限
    //   return { name: "403" };
    // }

    // 获取当前是否动态添加过
    const isAdd = store.state.user.isAdd;
    // 没有动态添加过时,才需要动态添加
    if (!isAdd) {
      // 0. 修改 isAdd 为 true
      store.commit("user/setIsAdd", true);
      // 1. 获取用户的个人信息, 并返回当前用户的路由权限数据
      const routes = await store.dispatch("user/getPerson");
      // 2. 循环routes, 动态添加路由
      routes.forEach((route) => {
        console.log("route.viewPath", route.viewPath);
        router.addRoute("index", {
          path: route.router,
          // PS: 如下代码会在生产出错，因为生产环境里面，根本就没有 .vue 的文件，需要对该文件先做构建才行
          // component: () => import(`../${route.viewPath}`),
          component: modules[`../${route.viewPath}`]
        });
      });
      // 3. 触发重定向
      return to.fullPath;
    }
  }
});

export default router;
